"""
AES加密
高级加密标准（Advanced Encryption Standard），又称Rijndael加密法，
是美国联邦政府采用的一种区块加密标准。对加密快和密钥的字节数都有一定的要求，
AES密钥长度的最少支持为128、192、256，加密块分组长度128位。需要知道密钥才能解密。
使用命令pip3 install pycryptodome，安装pycryptodome

分组密码加密中的四种模式有ECB、CBC、CFB、OFB。其中最常见的有ECB和CBC。
1、ECB模式
对明文分组，每组明文通过加密算法和密钥位运算得到密文，之后按照顺序将计算所得
的密文连在一起即可，各段数据之间互不影响。

2、CBC模式（使用最多的模式）
CBC模式需要一个初始化向量iv（和密钥长度相等的字符串），一般通过密钥生成器获取。
加密步骤如下：
1）首先将数据分组得到D1D2…Dn
2）第一组数据D1与初始化向量iv位运算的结果进行加密得到第一组密文C1
3）第二组数据D2与第一组的加密结果C1位运算以后的结果进行加密，得到第二组密文C2
4）之后的数据以此类推，得到Cn
5）按顺序连为C1C2C3…Cn即为加密结果。
特点：
1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
每个密文块依赖于所有的信息块，明文消息中一个改变会影响所有密文块
2.发送方和接收方都需要知道初始化向量
3.加密过程是串行的，无法被并行化（在解密时，从两个邻接的密文块中即可得到一个平文块。
因此，解密过程可以被并行化。）
4.解密时初始化向量必须相同
"""
import base64
from Crypto.Cipher import AES

# ECB加密模式

import base64
from Crypto.Cipher import AES


# 使用补0方法

# # 需要补位，补足为16的倍数
def add_to_16(s):
    while len(s) % 16 != 0:
        s += '\0'
    return str.encode(s)  # 返回bytes


# 密钥长度必须为16、24或32位，分别对应AES-128、AES-192和AES-256
key = 'abc4567890abc458'
# 待加密文本
text = 'hello'
# 初始化加密器
aes = AES.new(add_to_16(key), AES.MODE_ECB)
# 加密
encrypted_text = str(base64.encodebytes(aes.encrypt(add_to_16(text))), encoding='utf8').replace('\n', '')
# 解密
decrypted_text = str(
    aes.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\0').decode("utf8"))

print('加密值：', encrypted_text)
print('解密值：', decrypted_text)
